﻿package com.Galaxisfarm {
	// Bibliotecas da game engine Flixel
	import com.adamatomic.flixel.*;
	import flash.geom.Point;
	// Utilitários
	import flash.utils.*;
	
	public class PhaseFifthState extends PhaseState {
		// Habilita o target position do jogador
		private var _enable_target_position:Boolean;
		// Objetos que o jogador colide
		private var _collide_objects:FlxArray;
		// Contagem de itens para produzir curral
        private var _counter:Number = 2;
		// Contagem de itens para produzir estábulo
		private var _counter_cowshed:Number = 20;
		// Armazena se foi exibida a mensagem de item estragando
		private var _msg_deteriorated_show:Boolean = false;
		// Armazena se foi exibida a mensagem do medicamento
		private var _msg_drug_show:Boolean = false;
		// Armazena se foi exibida a mensagem da vaca morta
		private var _msg_dead_cow_show:Boolean = false;
		
		// Método construtor
		public function PhaseFifthState():void {
			// Chama o construtor da classe herdada
			super();
			
			_enable_target_position = false;
			
			// Roda o script lua
			runScriptLua("phase_fifth.lua");
			_freestall.play("producing");
			
			// Objetos que o jogador colide
			_collide_objects = new FlxArray;
			_collide_objects.add(_cowshed);
			_collide_objects.add(_freestall);
			_collide_objects.add(_midden);
			
			/*if (_river_amazonia != null)
				_collide_objects.add(_river_amazonia);*/
				
			/*if (_river_cerrado != null)
				_collide_objects.add(_river_cerrado);*/
			
			/*if (_river_mata_atlantica != null)
				_collide_objects.add(_river_mata_atlantica);*/
			
			// Verifica se o jogador existe
			if (_player) {
				// Define o x e y inicial do jogador
				var x:uint = FlxG.width / 2;
				var y:uint = FlxG.height / 2;
				_player.x = x;
				_player.y = y;
				
				var c:Boolean = true;
				var f:Boolean = true;
				var m:Boolean = true;
				
				do {
					c = _cowshed.overlaps(_player);
					f = _freestall.overlaps(_player);
					m = _midden.overlaps(_player);
				
					if (c || f || m) {
						x = randRange(0, (FlxG.width - _player.width));
						y = randRange(0, (FlxG.height - _player.height));
						_player.x = x;
						_player.y = y;
					}
				} while (c || f || m)
			
				// Cria o jogador
				_player.x = x;
				_player.y = y;
				_player.visible = true;
			}
			
			// Mensagem de instrução
			dialogBox("Você tem que levar\nos dejetos para esterqueira,\ntirar leite e tratar os animais.");
			_dialog_box.addComponent(new FlxButton(410, 365, new FlxSprite(null, 0, 0, false, false, 50, 20, 0xff25155E), function():void {
				setTimeout(function():void {
					_dialog_box.destroy();
					_enable_target_position = true;
				}, 100);
			}, new FlxSprite(null, 0, 0, false, false, 50, 20, 0xffE46713), new FlxText(0, 1, 50, 20, "OK", 0xffffff, null, 12, "center"), new FlxText(0, 1, 50, 20, "OK", 0xffffff, null, 12, "center")));
			
			addVersionBeta();
		}
		
		// Método chamado constantemente
		override public function update():void {
			super.update();
			
			// Se não existir dialog box atualiza os demais componentes
			if (!hasDialogBox()) {
				// Inicia o contador para estragar o item
				for (var j:int = 0; j < _freestall.totalItems(); j++) {
					var itemsJ:FlxArray = _freestall.getItems();
					itemsJ[j].startCounter();
				}
				
				// Produz os itens do curral
				// Enquanto for maior que zero
				// irá diminuir o contador
				if (_counter > 0) {
					_counter -= FlxG.elapsed;
				}
			
				// Quando contador menor que zero
				// cria novo item no curral
				if (_counter < 0) {
					// Volta o contador
					_counter = 2;
				
					// Cria os itens do curral
					createFreestallItems();
				}
				
				// Produz os itens do estábulo
				// Enquanto for maior que zero
				// irá diminuir o contador
				if (_counter_cowshed > 0) {
					_counter_cowshed -= FlxG.elapsed;
				}
				
				// Quando contador menor que zero
				// cria novo item no estábulo
				if (_counter_cowshed < 0) {
					// Volta o contador
					_counter_cowshed = 20;
				
					// Cria os itens do estábulo
					createCowshedItems();
				}
			
				// Apenas realiza as ações caso o jogador exista
				if (_player) {
					// Movimenta o personagem na tela
					// com o click do mouse
					if (FlxG.justPressed(FlxG.MOUSE)) {
						if (_enable_target_position)
							_player.setTargetPosition(FlxG.mouse);
					}
			
					// Verifica a colisão do jogador com os objetos
					var collided:Boolean = false;
					var collidedElement:* = null;
					var playerHeight:int = _player.height;
			
					for each (var e:* in _collide_objects) {
						if (getQualifiedClassName(e) != "com.adamatomic.flixel::FlxSprite")
							collided = e.overlapsPoint((_player.x < e.x ? _player.x + _player.width : _player.x), (_player.y < e.y ? (_player.y + playerHeight) : _player.y), true);
						else 
							collided = e.overlapsPoint(_player.x, _player.y + _player.height, true);
					
						if (collided) {
							collidedElement = e;
							break;
						}
					}
			
					if (collided) {				
						for each (var ce:* in _collide_objects) {
							try {
								if (ce != collidedElement)
									ce.unselected();
							} catch (errObject:Error) { }
						}
				
						// Seleciona objeto
						collidedElement.selected();
						// Jogador obtém itens do objeto
						playerGetItems();

						// Para o movimento do jogador
						// _player.stop();
					} else {
						if (FlxG.justPressed(FlxG.MOUSE)) {
							// Jogador está carregado itens?
							if (_player.totalItems() > 0) {
							
								// Primeiro item é uma vaca morta?
								var itemDeadCow:DeadCow = _player.getFirstItemAndRemove("discard");
								if (itemDeadCow != null) {
									// A posição alvo não pode colidir com nenhum elemento
									collided = false;
									for each (var el:* in _collide_objects) {
										collided = el.overlapsPoint(_player.getTargetPosition().x, _player.getTargetPosition().y, true);
									}
								
									// Se não hover colisão solta a vaca
									if (collided) {
										itemDeadCow.x = _player.getTargetPosition().x;
										itemDeadCow.y = _player.getTargetPosition().y;
										itemDeadCow.startCounter();
									}
								}
							}
						}
					}
				}
				
				// Limpa a esterqueira quando ela estiver cheia
				if (_midden.isFull()) {
					// Limpa a esterqueira
					_midden.clean();
					
					// Só exibe a mensagem quando for limpa pela primeira vez
					if (_midden.getCleanCount() <= 1) {
						dialogBoxDefault("Parabéns, você tratou os estercos da forma correta.\nEste esterco será um ótimo adubo\npara ser usado nas pastagens.");
					}
				}
				
				// Atualiza posição dos itens e
				// verifica se algum estragou, nessa caso exibe a mensagem de aviso apenas uma vez
				for (var i:int = 0; i < _freestall.totalItems(); i++) {
					var items:FlxArray = _freestall.getItems();
					items[i].y = (_freestall.y + _freestall.height) - ((_freestall.height / 2) + (i * 25));
					items[i].visible = true;
				
					if (!_msg_deteriorated_show) {
						if (!items[i].isGood()) {
							dialogBoxError("Seja mais rápido, os produtos estão\nse contaminando. Você não vai poder\ncomercializá-los.");
							_msg_deteriorated_show = true;
						}
					}
				}
			
				// A primeira vez que surgi um medicamento exibe a mensagem
				if (!_msg_drug_show && _cowshed.totalItems() == 1) {
					dialogBoxDefault("Você deve pegar as vacinas no celeiro\ne aplicar nas vacas no curral.\nSe você demorar muito as vacas podem morrer!");
					_msg_drug_show = true;
				}
			} else {
				// Para o contador para não estragar o item
				for (var k:int = 0; k < _freestall.totalItems(); k++) {
					var itemsK:FlxArray = _freestall.getItems();
					itemsK[k].stopCounter();
				}
			}
		}
		
		// Jogador obtém itens de outros objetos
		private function playerGetItems():void {
			var item:* = null;
			
			// Verifica se o curral está selecionado
			// indica que houve colisão com esse objeto
			if (_freestall.isSelected()) {
				// Jogador possui itens?
				if (_player.totalItems() > 0) {
					item = _player.getFirstItemAndRemove("freestall");
					if (item != null) {
						_freestall.dropItem(item);
						_hud.removeItem();
					}
				}
				
				// Jogador pode carregar novos itens?
				if (_player.hasSpace()) {
					// Possui itens?
					if (_freestall.totalItems() > 0 || _freestall.totalItemsDeadCows() > 0) {
						item = _freestall.getFirstItemAndRemove();
						if (item != null) {
							_player.addItem(item);
							_hud.addItem(getQualifiedClassName(item));
						}
					}
				}
			} else if (_midden.isSelected()) {
				// Jogador possui itens?
				if (_player.totalItems() > 0) {
					item = _player.getFirstItemAndRemove("midden");
					if (item != null) {
						_midden.dropItem(item);
						_hud.removeItem();
					}
				}
			} else if (_cowshed.isSelected()) {
				// Jogador possui itens?
				if (_player.totalItems() > 0) {
					item = _player.getFirstItemAndRemove("cowshed");
					if (item != null) {
						_cowshed.dropItem(item);
						_hud.removeItem();
					}
				}
				
				// Jogador pode carregar novos itens?
				if (_player.hasSpace()) {
					// Celeiro possui itens?
					if (_cowshed.totalItems() > 0) {
						item = _cowshed.getFirstItemAndRemove();
						if (item != null) {
							_player.addItem(item);
							_hud.addItem(getQualifiedClassName(item));
						}
					}
				}
			}
		}
		
		// Cria os itens que aparecem no estábulo
		private function createCowshedItems():void {
			// Somente cria novos itens se a quantidade
			// for menor que 5
			if (_cowshed.totalItems() < 5) {
				// Cria novo item
				var item:Drug = new Drug(_cowshed.x + _cowshed.width + 2, (_cowshed.y + _cowshed.height) - ((_cowshed.height / 2) + (_cowshed.totalItems() * 25)));
				// Define a animação como normal
				item.play("normal");
				item.visible = false;
				// Adiciona no array de itens
				_cowshed.addItem(item);
				
				// Adiciona vaca morta no curral
				if (_cowshed.totalItems() % 2 == 0) {
					// Cria novo item
					var dead_cow:DeadCow = new DeadCow(_freestall.x - 25, (_freestall.y + _freestall.height) - ((_freestall.height / 2) + (_freestall.totalItemsDeadCows() * 25)));
					// Define a animação como normal
					dead_cow.play("normal");
					dead_cow.visible = false;
					// Adiciona no array de itens
					_freestall.addItemDeadCow(dead_cow);
					
					// Exibe a mensagem da vaca morta
					if (!_msg_dead_cow_show) {
						dialogBoxError("Poxa! Você não vacinou os animais.\nUma vaca acaba de morrer!\nVocê deve retirá-la do curral e descartá-la\nem área ambientalmente correta, longe das águas.");
						_msg_dead_cow_show = true;
					}
				}
			}
		}
		
		// Cria os itens que aparecem no curral
		private function createFreestallItems():void {
			// Somente cria novos itens se a quantidade
			// for menor que 5
			if (_freestall.totalItems() < 5) {
				// Cria novo item
				var item:* = createRandomItem();
				// Define a animação como normal
				item.play("normal");
				item.visible = false;
				// Adiciona no array de itens
				_freestall.addItem(item);
			}
		}
		
		// Cria um item aleatório
		private function createRandomItem():* {
			var high:int = 3;
			var low:int = 1;
			var n:int = Math.round(Math.random() * (high - low)) + low;
			
			switch(n) {
				case 1:
					return new Meat(_freestall.x + _freestall.width + 2, (_freestall.y + _freestall.height) - ((_freestall.height / 2) + (_freestall.totalItems() * 25)));
					break;
				case 2:
					return new Manure(_freestall.x + _freestall.width + 2, (_freestall.y + _freestall.height) - ((_freestall.height / 2) + (_freestall.totalItems() * 25)));
					break;
				case 3:
					return new Dairy(_freestall.x + _freestall.width + 2, (_freestall.y + _freestall.height) - ((_freestall.height / 2) + (_freestall.totalItems() * 25)));
					break;
			}
		}
	}
}